//函数闭包
package main

import (
	"fmt"
)

/*
	函数闭包： 在某函数f内部存在子函数，子函数可以访问主函数的数据，f函数退出时，如果子函数仍需要这部分数据，内存将不会释放
*/

//生成自增序列
func getNext() func() int {
	i := 0 //f函数的数据
	return func() int {
		i++ // i在f函数内，对f的数据进行操作
		return i
	}
}

func main() {
	f := getNext() // f = func() int
	fmt.Println(f())
	fmt.Println(f())
	fmt.Println(f())
	fmt.Println(f())
	f1 := getNext()
	fmt.Println("f1:", f1())
	fmt.Println("f1:", f1())
	fmt.Println("f1:", f1())
	fmt.Println("f:", f())
}
